#include <chrono>
#include <iostream>
#include <ratio>
#include <thread>

using std::cout;
using std::endl;
int main(void)
{
    ///记录时长的duration
    typedef std::chrono::duration<int, std::ratio<1,1>> seconds_type;
    typedef std::chrono::duration<int, std::milli> milliseconds_type;
    typedef std::chrono::duration<int, std::ratio<60*60>> hours_type;

    hours_type h_oneday(24); //24 h
    seconds_type s_oneday(60*60*24);
    milliseconds_type ms_oneday(s_oneday);


/*    std::thread t1([](){*/
            //std::cout << "sleep 3" << std::endl;
            //std::this_thread::sleep_for(std::chrono::seconds(3));
            //});

    //t1.join();


    using namespace std::chrono;

    {
        milliseconds foo(1000); //相等于 chrono::duration<int, ratio<1, 1000>>
        foo *= 60;

        seconds bar(10);

        std::cout << "duration(in preiods):";
        std::cout << foo.count() << " milliseconds \n"; //返回持续时间对象的内部计数， 此处的 duration object 为 毫秒 milliseconds

        std::cout << "duration(in preiods):";
        std::cout << bar.count() << " seconds \n"; //返回持续时间对象的内部计数,此处  duration object  为 秒 seconds
    }


    {
        //时间间隔之间可以做运算
        std::chrono::minutes t1(10);
        std::chrono::seconds t2(60);

        std::chrono::seconds t3 = t1 - t2;
        std::cout << t3.count() << " sencond " << std::endl;

        cout << std::chrono::duration_cast<std::chrono::minutes>(t3).count() << " minutes " << endl;
    }

    //duration 的加减运算有一定的规则，当两个 duration 时钟周期不相同时，
    //会先统一成一种时钟,然后再作加减运算。统一成一种时钟的规则如下：
    //对于 `ratio <x1, y1> count1；ration<x2, y2> count2;`如果x1、x2的最大公约数为x，
    //y1、y2的最小公倍数为y，那么统一之后的ratio为ratio<x,y>
    {
        std::chrono::duration<double, std::ratio<9, 7>>  d1(3);
        std::chrono::duration<double, std::ratio<6, 5>>  d2(3);

        auto d3 = d1 - d2;
        cout << typeid(d3).name() << endl;
        cout << d3.count() << endl;

        cout << std::chrono::duration_cast<std::chrono::minutes>(d3).count() << " minutes " << endl; 
        //将 dtn 的值转换为其他一些duration 类型，同时考虑到它们的periods 差异。
        cout << std::chrono::duration_cast<std::chrono::duration<double, std::ratio<9, 7>>>(d3).count() << " minutes " << endl; //其实可以转换任意周期
    }
    //根据前面减少的规则，对于9/7 和 6/5， 分子取最小公约数，分母取最小公倍数，
    //所以，统一之后的ruration 为 std::chrono::duration<double ,std::ratio<3, 35>>。
    //然后再将原来的duraion转换为统一的duration，最后计算的时钟周期数为:
    //((9/7) / (3/35) *3) - (6/5) / (3/35) *1) = 31

    
    return 0;
}
